////////////////////////////////////////////////////////////////////
//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//         佛祖保佑       永无BUG     永不修改                       //
////////////////////////////////////////////////////////////////////
#include <fstream>//ifstream读文件，ofstream写文件，fstream读写文件
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<cstdlib>
#include "basic.h"
#include "func.h"
#include "cli.h"
#include "cli_func.h"
using namespace std;

char textn[1000];

void runletter(int, char);
void get_yrtext(string textname);
void startcli();

int main(int argc, char** argv) {
    //---------------------从终端获取参数---------------------
    string inFile = "";
    if (argc == 2) {
        inFile = argv[1];
        //  cout<<inFile<<endl;
        get_yrtext(inFile);
    }
    else {
        startcli();
        //cout << "Usage: ./yrfile InputFile\n";
        //return 1;
    }
    //-----------------------end-------------------
    //---------------------------------------------

    // ...
}
// extern map<string,int> yrimem;//map模拟内存空间
//
string value;
void runletter(int line, char letter[]) {
    if (note(letter)) {//如果是注释
        return;//跳过直接下一步
    }
    else {
        grammar(letter, line);//先判断语句是否合法
        int type = Judge_function_type(letter), i1 = 0;
        switch (type) {
        case 0:
            break;
        case 1:
            break;
        case 2:
            yrsays(letter);
            // cout<<"yrsays"<<endl;
            break;
        case 3:
            // cin >> value;
            yreat(letter);
            // cout<<"yreat"<<endl;
            break;
        case 4:
            operation(letter);
            break;
        case 5:
            define_vars(letter);
            break;
        case 10:
            // yf(letter);
            if(yf(letter)){
                int p=0;char runlet[1000];
                for(int i=0;i<strlen(letter);i++){
                    if(letter[i]==' ')p=i+1;
                }
                _strcpy(runlet,letter,p,strlen(letter)-1);
                runletter(line,runlet);
            }
            break;
        default:
            cout << "WRONG" << endl;

        }
        // user_func.yrsays(letter);
        // cout<<letter<<endl;
    }
}
void runletter_cli(char letter[]) {
    if(!strcmp(letter,"exit()"))exit(0);
    if (note(letter)) {//如果是注释
        return;//跳过直接下一步
    }
    else {
        define__del_endbeg(letter);
        define_del_mid(letter);
        if(letter[0]=='h'&&letter[1]=='e'&&letter[2]=='l'&&letter[3]=='p'){
            help(letter);
            return;
        }
        int strl = strlen(letter);
        // if ((letter[strl - 1] != 'r' || letter[strl - 2] != 'y' || letter[strl - 3] != ' ')&&(sentence_type(letter)==1)) {
        //     cout << "Should end with yr\n";
        //     return;
        // }
        int type = Judge_function_type(letter), i1 = 0;
        switch (type) {
        case 0:
            break;
        case 1:
            cout << "Not a func" << endl;
            break;
        case 2:
            yrsays(letter);
            // cout<<"yrsays"<<endl;
            break;
        case 3:
            // cin >> value; cin.sync();
            yreat(letter);
            // cout<<"yreat"<<endl;
            break;
        case 4:
            operation(letter);
            break;
        case 5:
            define_vars(letter);
            break;
        case 10:
            // yf(letter);
            if(yf(letter)){
                int p=0;char runlet[1000];
                for(int i=0;i<strlen(letter);i++){
                    if(letter[i]==' '){
                        p=i+1;
                        break;
                    }
                }
                _strcpy(runlet,letter,p,strlen(letter)-1);
                runletter_cli(runlet);
            }
            break;
        default:
            cout << "WRONG" << endl;

        }
        // user_func.yrsays(letter);
        // cout<<letter<<endl;
    }
}
//get_yrtext作用：获取运行文件名同时判断是否存在
void get_yrtext(string textname) {
    strcpy(textn, textname.c_str());
    ifstream in(textn);
    string line;
    if (!in) {//没有文件
        cout << "no such file" << endl;
    }
    else {//有文件
        int countline = 1;
        while (getline(in, line)) {
            countline++;
            char letter[1000];
            strcpy(letter, line.c_str());
            runletter(countline, letter);
        }
    }
}

void startcli() {
    geng_picture();
    cout << "Yr-Language 0.5    "; cout_time();cout << "Enter \"exit()\" to exit     " << "Enjoy!" << endl;
    char letter[1000]={ };
    while (1) {
        cout << "#>> ";
        cin.getline(letter, 999, '\n'); cin.sync();
        // if (!strcmp(letter, "exit"))exit(0);

        //cout << strl;
        //if(endwith_yr_cli(letter))return ;//先判断语句是否合法

        runletter_cli(letter);
    }
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
